home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
paolib
/
vsync.asm
< prev
next >
Wrap
Assembly Source File
|
1991-10-18
|
10KB
|
375 lines
;==============================================================================
; << 386ASM V2.0 >> for FM TOWNS
;==============================================================================
.386p
PAGE 60,132
NAME VSYNC
TITLE VSYNC Interrupt
;==============================================================================
; VSYNC 割り込み
;
; CREATE : 1990.06.01
; FINISH : 1990.06.02
;
; < High C からの呼出形式 >
; extern int (*VSYNC_entry)() ;
; extern VSYNC_init() ;
; extern VSYNC_end() ;
;
; static int vsync_func1() ;
; VSYNC_entry = vsync_func1 ;
; VSYNC_init() ;
; VSYNC_end();
;
; < note > : TABS = 4
;
; < History >
; 1990.06.01 : CREATE
; 1990.08.03 : vsync_release 時のバグ修正
; 1991.04.13 : 清書
;
; ★注意
; このプログラムを呼ぶプログラムの
; オブジェクトは、ネイティブの最初に
; おいて下さい。(先頭から64K以内に入る
; ようにするため。)
;
; Programmed by Y.Hirata ( Nifty-ID : NAB03321 )
;==============================================================================
;
INCLUDE hc.inc ;
;
CGROUP GROUP pmcode, CODE ;
DGROUP GROUP rmcode, DATA ;
;
;--------------------------------------------
public VSYNC_init ; VSYNC 割り込み登録
public VSYNC_end ; VSYNC 割り込み解除
;
public VSYNC_entry ; VSYNC ハンドラ・アドレス(ネイティブ)
;--------------------------------------------
;
;********************************************
; 定数定義
;********************************************
;
INT_NUM EQU 00Bh ; IRQ B (オプションボード)
IRQ_0B_ON EQU 08h ; IRQ B 割り込み許可 (11 ビット)
IRQ_0B_OFF EQU 0F7h ; IRQ B 割り込み不許可 (11 ビット)
VSYNC_CLR EQU 05CAh ; VSYNC割り込み原因クリアレジスタ
;
;
;////////////////////////////////////////////
; リアル部
;////////////////////////////////////////////
;
rmcode SEGMENT ;
ASSUME cs:rmcode ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ネイティブ-リアルの場合、セグメントレジスタは、 リアルから
; ネイティブに戻った場合にネイティブオリジナルの値に
; DOS-Extenderが復元してくれるので保存/復元
; は省略。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;********************************************
; VSYNC リアルハンドラ内での使用データ領域
;********************************************
;
PROT_entry DD ? ; リアルモードDOS-Extenderプロシジャアドレス
;
vsync_flg DB 0 ; VSYNC割り込みは許可されているか?
;
int_mask_data LABEL byte ; 割り込み許可データ
DB ? ; ビット 31~24 +0
DB ? ; ビット 23~16 +1
DB ? ; ビット 15~ 8 +2
DB ? ; ビット 7~ 0 +3
;
vsync_offset DW ? ; 割り込みデータブロック・オフセット
vsync_segment DW ? ; 割り込みデータブロック・セグメント
;
vsync_adrs DB 0 ; 割り込みデータブロック..
DB 0 ;
DW OFFSET vsync_hook ; ハンドラアドレス・オフセット
DW ? ; ハンドラアドレス・セグメント
;
stackOff DW 0 ; スタック退避用(ポインタ)
stackSeg DW 0 ; スタック退避用(セグメント)
;
DB 512 DUP(0) ; local stack
tmpRstack LABEL byte ;
;
;
;--------------------------------------------
; VSYNC リアルハンドラの登録
;--------------------------------------------
vsync_setup PROC FAR ; VSYNCハンドラの登録
push ds ;
push di ;
push dx ;
;
mov ah,1 ;
mov dl,INT_NUM ; 割り込み要因コード
int INT_INT ; 割り込みデータブロックアドレスの取り出し
;
mov cs:vsync_offset,di ; データブロックアドレス・オフセット
mov cs:vsync_segment,ds ; データブロックアドレス・セグメント
;
mov word PTR cs:[vsync_adrs+4],cs
; VSYNC ハンドラのセグメント
push cs ;
pop ds ; ds = cs
mov ah,00h ;
mov dl,INT_NUM ; 割り込み要因コード
mov di,OFFSET vsync_adrs ;
int INT_INT ; 割り込みデータブロックアドレスの登録
;
mov ah,3 ;
mov di,OFFSET int_mask_data ; 割り込み許可データ
int INT_INT ; 割り込み管理データの取り出し
;
mov cs:vsync_flg,FALSE ;
test byte PTR cs:[di+2],IRQ_0B_ON
jz int_enable ;
mov cs:vsync_flg,TRUE ; VSYNC割り込み許可済
;
int_enable: ;
or byte PTR cs:[di+2],IRQ_0B_ON
; VSYNC 割り込みの許可
mov ah,2 ;
int INT_INT ; 割り込み許可データの書き込み
;
pop dx ;
pop di ;
pop ds ;
ret ;
vsync_setup ENDP ;
;
;--------------------------------------------
; VSYNC リアルハンドラの登録解除
;--------------------------------------------
vsync_release PROC FAR ; VSYNC 解除
push ds ;
push di ;
push dx ;
;
push cs ;
pop ds ; ds = cs
mov di,OFFSET int_mask_data ; 割り込み許可データ
and byte PTR cs:[di+2],IRQ_0B_OFF
; VSYNC 割り込みの禁止
cmp cs:vsync_flg,TRUE ;
jne vsync_permission ;
or byte PTR cs:[di+2],IRQ_0B_ON
; VSYNC 割り込み許可
;
vsync_permission: ;
mov ah,2 ;
int INT_INT ; 割り込み許可データの書き込み
;
mov ah,0 ;
mov dl,INT_NUM ; 割り込み要因コード
lds di,dword PTR cs:vsync_offset
; 割り込みデータブロック
int INT_INT ; 割り込みデータブロックアドレスの登録
;
pop dx ;
pop di ;
pop ds ;
ret ;
vsync_release ENDP ;
;
;--------------------------------------------
; VSYNC リアルハンドラ
;--------------------------------------------
; ここから、ネイティブハンドラを呼び出すが、その
; 時には、ここのスタックが使用されるために、
; ローカルスタックを確保しておく必要がある。
; (リアルからネイティブを呼び出す時には、かなりの
; スタックが呼出し側で必要となるので、注意する
; 必要がある。)
;
vsync_hook PROC FAR ;
cli ;
mov word PTR cs:stackSeg,ss ; スタック退避
mov word PTR cs:stackOff,sp ;
;
push cs ;
pop ss ; ss = cs
mov sp,OFFSET tmpRstack ; ローカルスタック使用
;
push cs ;
pop ds ; ds = cs
pushad ; レジスタ退避
;
mov dx,VSYNC_CLR ;
out dx,al ; ダミーライト (VSYNC割り込み原因クリア)
;
push word PTR 0 ;
push dword PTR 0 ;
push word PTR CODESEG ;
push dword PTR OFFSET VSYNC_handler
; 呼び出すネイティブルーチンアドレス
sti ;
call cs:PROT_entry ; ネイティブプロシジャの呼出し
cli ;
add sp,12 ;
;
popad ; レジスタ復帰
mov ss,word PTR cs:stackSeg ; スタックを元に戻す
mov sp,word PTR cs:stackOff ;
;
lds di,dword PTR cs:vsync_offset
; 本来のVSYNCハンドラに処理を移す
jmp dword PTR ds:[di+2] ; Jump Real Handler
;
vsync_hook ENDP ;
;
rmcode ENDS ;
;
;
;////////////////////////////////////////////
; ネイティブ部
;////////////////////////////////////////////
;
;********************************************
; VSYNC ネイティブハンドラ内での使用データ領域
;********************************************
;
DATA SEGMENT ;
;
REG_esp DD 0 ; スタック退避用(ポインタ)
REG_ss DW 0 ; スタック退避用(セグメント)
;
DB 32768 DUP (?) ; ネイティブ・ローカルスタックサイズ(適当)
TmpSTACK LABEL byte ;
;
DATA ENDS ;
;
;
;********************************************
; VSYNC ネイティブ処理
;********************************************
;
pmcode SEGMENT ;
ASSUME cs:CGROUP, ds:DGROUP ;
;
VSYNC_entry DD ? ; VSYNC ネイティブハンドラ アドレス
;
;--------------------------------------------
; VSYNC ネイティブハンドラ
;--------------------------------------------
ALIGN 4 ; dword boundary
VSYNC_handler PROC FAR ;
cli ;
push ds ;
;
mov ax,DATASEG ;
mov ds,ax ;
mov word PTR REG_ss,ss ; スタック退避
mov dword PTR REG_esp,esp ;
;
mov es,ax ;
mov ss,ax ; ss = es = ds
mov esp,OFFSET TmpSTACK ; ローカルスタックの確保
pushad ; レジスタ退避
sti ;
;
call dword PTR cs:VSYNC_entry
; VSYNC ネイティブハンドラを呼ぶ(HighC用)
;
cli ;
popad ; レジスタ復帰
mov ss,word PTR REG_ss ; スタックを元に戻す
mov esp,dword PTR REG_esp ;
pop ds ;
xor eax,eax ; Return Code = 0
sti ;
ret ;
VSYNC_handler ENDP ;
;
;--------------------------------------------
; VSYNC 割り込み登録
;--------------------------------------------
ALIGN 4 ; dword boundary
VSYNC_init PROC NEAR ;
push ebp ;
mov ebp,esp ; スタックフレーム形成
;
push es ;
push ds ;
push ecx ;
push ebx ;
;
mov ax,0250dh ;
int INT_DOS ; リアルモードリンク情報の取得
mov PROT_entry,eax ; リアルモードDOS-Extenderプロシジャアドレス
; リアル から ネイティブ を call するため
; の処理。
;
push ds ;
pop es ; es = ds
xor ebx,ebx ;
lea ecx,_realend ;
mov ax,0250fh ;
int INT_DOS ; ネイティブ->リアル の アドレス変換
;
mov ebx,ecx ; セグメント
lea bx,vsync_setup ; オフセット
xor ecx,ecx ; ecx = 0
mov ax,0250eh ;
int INT_DOS ; リアルモードプロシジャの呼出
;
pop ebx ;
pop ecx ;
pop ds ;
pop es ;
xor eax,eax ; return code = 0
;
pop ebp ; スタックフレーム開放
ret ;
VSYNC_init ENDP ;
;
;--------------------------------------------
; VSYNC 割り込み解除
;--------------------------------------------
ALIGN 4 ; dword boundary
VSYNC_end PROC NEAR ;
push ebp ;
mov ebp,esp ; スタックフレーム形成
;
push es ;
push ds ;
push ecx ;
push ebx ;
;
push ds ;
pop es ; es = ds
xor ebx,ebx ;
lea ecx,_realend ;
mov ax,0250fh ;
int INT_DOS ; ネイティブ->リアル の アドレス変換
;
mov ebx,ecx ; セグメント
lea bx,vsync_release ; オフセット
xor ecx,ecx ; ecx = 0
mov ax,0250eh ;
int INT_DOS ; リアルモードプロシジャの呼出
;
pop ebx ;
pop ecx ;
pop ds ;
pop es ;
xor eax,eax ; return code = 0
;
pop ebp ; スタックフレーム開放
ret ;
VSYNC_end ENDP ;
;
pmcode ENDS ;
;
END